#ifndef DYN_MULTIFUNCTOR_HAMILTONIAN_H
#define DYN_MULTIFUNCTOR_HAMILTONIAN_H

#include "dyn_multifunctor.h"

/*! \brief Defines separate methods for Hamiltonian systems.
 *
 * Mostly for use with symplectic integrators.
 * Instead of using a single overloaded
 * operator(), we use methods for both \f$\mathbf{q}\f$
 * and \f$\mathbf{p}\f$ \f$n\f$-dimensional vectors.
 */

class HamiltonianSystem : public MultiFunctor
{
public:
    /*! Empty constructor. */
    HamiltonianSystem(){}

    /*! Pure virtual functions that will
     * define the coupled equations of motion
     * for the Hamiltonian system.
     */
    //@{
    /*! Returns \f$\frac{\partial H}{\partial\mathbf{p}}\f$ at \f$\mathbf{X}\f$.*/
    virtual colvec q(colvec X)=0;
    /*! Returns \f$-\frac{\partial H}{\partial\mathbf{q}}\f$ at \f$\mathbf{X}\f$.*/
    virtual colvec p(colvec X)=0;
    //@}
};

#endif // DYN_MULTIFUNCTOR_HAMILTONIAN_H
